package com.example.smartpark.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.smartpark.dto.ParkingSpaceAddDTO;
import com.example.smartpark.dto.ParkingSpaceUpdateDTO;
import com.example.smartpark.model.ParkingSpace;
import com.example.smartpark.vo.ParkingSpaceVO;

import java.util.List;

/**
 * 车位服务接口
 */
public interface ParkingSpaceService extends IService<ParkingSpace> {

    /**
     * 分页获取车位列表
     *
     * @param page 页码
     * @param size 每页数量
     * @param parkingLotId 停车场ID（可选）
     * @param spaceNumber 车位编号（可选）
     * @param area 所在区域（可选）
     * @param status 状态（可选）
     * @return 分页车位列表
     */
    IPage<ParkingSpaceVO> getParkingSpacePage(int page, int size, Integer parkingLotId, String spaceNumber, String area, Integer status);

    /**
     * 获取车位详情
     *
     * @param id 车位ID
     * @return 车位详情
     */
    ParkingSpaceVO getParkingSpaceById(Integer id);

    /**
     * 根据停车场ID获取所有车位
     *
     * @param parkingLotId 停车场ID
     * @return 车位列表
     */
    List<ParkingSpaceVO> getParkingSpacesByLotId(Integer parkingLotId);

    /**
     * 添加车位
     *
     * @param parkingSpaceAddDTO 添加车位DTO
     * @return 添加的车位信息
     */
    ParkingSpaceVO addParkingSpace(ParkingSpaceAddDTO parkingSpaceAddDTO);

    /**
     * 更新车位信息
     *
     * @param id 车位ID
     * @param parkingSpaceUpdateDTO 更新车位DTO
     * @return 更新后的车位信息
     */
    ParkingSpaceVO updateParkingSpace(Integer id, ParkingSpaceUpdateDTO parkingSpaceUpdateDTO);

    /**
     * 删除车位
     *
     * @param id 车位ID
     * @return 是否删除成功
     */
    boolean deleteParkingSpace(Integer id);

    /**
     * 检查车位编号是否已存在于指定停车场
     *
     * @param parkingLotId 停车场ID
     * @param spaceNumber 车位编号
     * @param excludeId 排除的车位ID（用于更新时）
     * @return 是否存在
     */
    boolean checkSpaceNumberExists(Integer parkingLotId, String spaceNumber, Integer excludeId);

    /**
     * 批量添加车位
     *
     * @param parkingLotId 停车场ID
     * @param prefix 车位编号前缀
     * @param startNumber 起始编号
     * @param count 车位数量
     * @param spaceType 车位类型
     * @param area 所在区域
     * @param floor 所在楼层
     * @return 添加的车位列表
     */
    List<ParkingSpaceVO> batchAddParkingSpaces(Integer parkingLotId, String prefix, Integer startNumber, Integer count,
                                              Integer spaceType, String area, String floor);
} 